/**
 * @file TestFunc.c
 * @author your name (you@domain.com)
 * @brief 用来写可以在串口中调用的循环测试函数
 * @version 0.1
 * @date 2024-06-06
 * 
 * @copyright Copyright (c) 2024
 * 
 * 结合正点原子的usmart串口调试组件，可以在串口中调用这里的函数，
 * 通过调用观察者，可以实现轮询其他模块的状态
 * 执行方式说明：在主函数的 TIM6_pollCall(getGlobalTime())中会执行usmart中的scan函数，
 * scan扫描到串口的消息后就会执行usmart中的exe函数，即我们在串口中输入这里的测试函数。
 * 然后就会阻塞地执行这里的函数。所以在这里再加上TIM6_pollCall函数，实现对其他模块的轮询。
 * 调用堆栈：main->TIM6_pollCall->notify->usmart_scan->Test_rotAngleCommon->TIM6_pollCall
 * @warning 记得在usmart_config.c中添加函数声明
 *
 * 
 */
#include "main.h"
#include "IT_Callback.h"

#include "rotate.h"
uint8_t Test_rotAngle(float angle,Direction direction);
/**
 * @brief 测试旋转函数
 * 
 * @param angle 旋转角度
 * @param direction 0:左转 1:右转
 * @note 这个是一个示例，想要在usmart中调用这种需要其他模块支持的函数，又要轮询执行的话，就这样写
 */
void Test_rotAngleCommon(int angle,int direction)
{
    int ret=0;
    while (ret==0)
    {
        ret=Test_rotAngle(angle,(Direction)direction);
        TIM6_pollCall(getGlobalTime());//轮询其他模块，这是这个示例的关键
    }
    
}
#include "speedUp.h"
#include "findline.h"
#include "control.h"
#include "camera.h"
void flMethod_speedUp(int rank);
uint8_t accelerateBaseOnDistance(int16_t distance,int16_t acceleration,uint16_t maxSpeed);
void flMethod_speedUpReversing(int rank);
void Test_speedUp(int16_t dis,int16_t acc,uint16_t max){
    int ret=0;
    gl_controlCenter.findLineFlag=0;
    while(ret==0){
      if (USART_DataIsReceived(&usartCamera) == true) {
        USART_DataResetReceivedFlag(&usartCamera);
        ret = accelerateBaseOnDistance(dis, acc, max);
        int getLineRank();
        int findLineRank = getLineRank();
        flMethod_speedUp(findLineRank);
        TIM6_pollCall(getGlobalTime());
      }
    }
}
void Test_speedUpRes(int16_t dis,int16_t acc,uint16_t max){
    int ret=0;
    gl_controlCenter.findLineFlag=0;
    while(ret==0){
        ret=accelerateBaseOnDistance(dis,acc,max);
        int getLineRank();
        int findLineRank = getLineRank();
        flMethod_speedUpReversing(findLineRank);
        TIM6_pollCall(getGlobalTime());
    }
}
void flMethod_gyro(int16_t speed);
#include "mydelay.h"
#include "motor.h"
//测试陀螺仪走直线,10秒后停止
void Test_flMethod_gyro(int16_t speed){
    gl_controlCenter.findLineFlag=0;
    while(myDelay((uint32_t)Test_flMethod_gyro,10000)==false){
        flMethod_gyro(speed);
        TIM6_pollCall(getGlobalTime());
    }
    motorStop();
}
uint8_t rotFast(int16_t angle,uint16_t distance,float speed,int16_t exitAngle);
void Test_rotFast(int angle,int distance,int speed){
    int ret=0;
    while(ret==0){
        ret=rotFast(angle,distance,speed,angle);
        TIM6_pollCall(getGlobalTime());
    }
    motorStop();
}